package rodrigosetti.colorstrike.fase;

import java.io.IOException;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

import rodrigosetti.colorstrike.core.Constantes;
import rodrigosetti.colorstrike.core.Vetor2D;
import rodrigosetti.midpgame.GameCore;

public class Heroi extends Personagem {

	public static final float IMPULSO = 50.0f;
	public static final float ACELERACAO = 1.0f;
	public static final float JOGO = 0.6f;
	
	public static final int JOGANDO = 0;
	public static final int GANHOU = 1;	

	private int estado = JOGANDO;
	public boolean vida;
	public boolean morrendo;
	private boolean direcao;
	
	private int identidade;
	private long cronometro;
	private static Image imagem;
	private int lastPosX;
	
	public int posicaoVetor;

	public Heroi(Fase fase, int posx, int posy) {
		super(fase, posx, posy);
		lastPosX = posx;
		
		if (imagem == null) {
			try {
				imagem = Image.createImage("/heroi.png");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		identidade = Constantes.RED;
		morrendo = false;
		vida = true;
		
		sprite = new Sprite(imagem, Constantes.HEROI_X, Constantes.HEROI_Y);		
		sprite.defineCollisionRectangle(2, 2, Constantes.HEROI_X-2, Constantes.HEROI_Y-2);
                sprite.defineReferencePixel(Constantes.HEROI_X/2, Constantes.HEROI_Y/2);
		sprite.setPosition(posx, posy);		
		
		setFrames();		
	}

	private void setFrames()
	{	
		sprite.setFrameSequence(Constantes.SEQ_HEROI[identidade]);
	}
	
	/**
	 * Retorna estado do heroi.
	 * @return
	 */
	public int getEstado()
	{
		return estado;
	}
	
	public void atualizar() {
		super.atualizar();

		/* Verifica limite de queda */
		if (posicao.y > fase.limiteQueda)
		{
			fase.reiniciar();
		}		
		
		/* se estiver morrendo, nao responda a teclas */
		if (morrendo)
			return;
		
		if ((GameCore.teclas & GameCore.KEY_LEFT) > 0)
		{
			velocidade.x -= JOGO;
			if (!direcao)
			{
				direcao = true;
				sprite.setTransform(Sprite.TRANS_MIRROR);
			}
		}
		if ((GameCore.teclas & GameCore.KEY_RIGHT) > 0)
		{
			velocidade.x += JOGO;
			if (direcao)
			{
				direcao = false;
				sprite.setTransform(Sprite.TRANS_NONE);
			}			
		}
		if ((GameCore.teclas & GameCore.KEY_FIRE) > 0)
		{
			identidade = (identidade+1)%3;
			setFrames();
			GameCore.limparTecla();
		}
	}
	
	

	/**
	 * Interage heroi com bloco e com outros personagens
	 */
	public void interagir(Elemento e) {
		
		/* Se estiver morrendo nao interage com nada */
		if (morrendo)
			return;
		
		/* Testa colisao */
		int tipoColisao = this.colide(e);
		
		/* Se eh bloco */
		if (e instanceof Bloco) {
			
			if (tipoColisao != Elemento.SEM_COLISAO)
			{
				/* Passa pelo bloco sem colisao: permissivo */
				if (((Bloco)e).tipo == Bloco.PERMISSIVO && ((Bloco)e).identidade != this.identidade)
					return;
				
				/* Bloco ofensivo */
				else if (((Bloco)e).tipo == Bloco.OFENSIVO && ((Bloco)e).identidade != this.identidade)
				{
					this.hit();
				}	
			}
										
			/* Se colide os pes */
			if (tipoColisao == Elemento.SUPERIOR) {

				if ((GameCore.teclas & GameCore.KEY_LEFT) > 0)
				{
					velocidade.x -= ACELERACAO;
				}
				if ((GameCore.teclas & GameCore.KEY_RIGHT) > 0)
				{
					velocidade.x += ACELERACAO;
				}
				
				/* Verifica se tecla de pulo esta pressionada */
				if ((GameCore.teclas & GameCore.KEY_UP) > 0) {
					velocidade.y += IMPULSO;
					sprite.setFrame(4);
				}				
				else if (Math.abs(lastPosX - posicao.x) > 8)
				{
					sprite.nextFrame();
					if (sprite.getFrame() == 4)
					{
						sprite.setFrame(0);
					}						
					lastPosX = (int)posicao.x;
				}
			}	
			
			if (tipoColisao != Elemento.SEM_COLISAO)
			{
				super.interagir(e);
			}			
		}
		/* Se eh inimigo */
		else if (e instanceof Inimigo)
		{
			/* Se inimigo ja esta morrendo, ignora */
			if (((Inimigo)e).morrendo)
				return;
			
			/* Se colide */
			if (tipoColisao != Elemento.SEM_COLISAO)
			{
				/* testa se eh contra */
				if (((Inimigo)e).identidade == this.identidade)
				{
					/* Vence inimigo */
					((Inimigo)e).morrendo = true;
					e.sprite.setTransform(Sprite.TRANS_ROT180);
					((Inimigo)e).velocidade.y -= ACELERACAO;
					
					/* Se colide os pes */
					if (tipoColisao == Elemento.SUPERIOR) {

						/* Verifica se tecla de pulo esta pressionada */
						if ((GameCore.teclas & GameCore.KEY_UP) > 0) {
							velocidade.y += IMPULSO * fase.atrito;
						}
						if ((GameCore.teclas & GameCore.KEY_LEFT) > 0)
						{
							velocidade.x -= ACELERACAO;
						}
						if ((GameCore.teclas & GameCore.KEY_RIGHT) > 0)
						{
							velocidade.x += ACELERACAO;
						}
						
						if (Math.abs(lastPosX - posicao.x) > 8)
						{
							sprite.nextFrame();
							lastPosX = (int)posicao.x;
						}
					}
				}
				else
				{
					this.hit();
				}
				if (tipoColisao == Elemento.SUPERIOR)
				{
					velocidade.y *= -1.0f;
				}
			}
		}
		else if (e instanceof Bandeira)
		{
			if (tipoColisao != Elemento.SEM_COLISAO)
			{
				estado = GANHOU;
			}
		}
	
	}
	
	public void desenhar(Graphics g)
	{
		if (System.currentTimeMillis() - cronometro > 2000)
		{
			super.desenhar(g);
		}
		else 
		{
			if ((System.currentTimeMillis() - cronometro)%10 < 5)
			{
				super.desenhar(g);
			}
		}
	}
	
	/* Causa dano ao heroi */
	public void hit()
	{
		if (System.currentTimeMillis() - cronometro <= 2000)
		{
			return;
		}
		
		/* Heroi perde */
		if (this.vida)
		{
			/* Perde vida */
			vida = false;
			cronometro = System.currentTimeMillis();
		}
		else
		{
			/* Mata heroi */
			fase.foco = new Vetor2D(posicao.x, posicao.y);
			this.morrendo = true;
			this.sprite.setTransform(Sprite.TRANS_ROT180);
			this.velocidade.y -= ACELERACAO;
			this.velocidade.x = 0;
		}
	}
	
	public void onHide()
	{
		fase.reiniciar();
	}

	public void onShow() {
		// TODO Auto-generated method stub
		
	}
}


